use serde_json::{Map, Value};
use wither::bson::Document;

/// ## assign_json_object
/// 将两个对象合并，使用深拷贝
pub fn assign_json_object(lv: &Value, rv: &Value) -> Value {
    let mut n_json_map = Map::new();
    if let Value::Object(obj) = lv {
        for (k, v) in obj {
            n_json_map.insert(k.clone(), v.clone());
        }
    }
    if let Value::Object(obj) = rv {
        for (k, v) in obj {
            n_json_map.insert(k.clone(), v.clone());
        }
    }
    Value::Object(n_json_map)
}

pub fn valid_form_data(definition_value: &Document, form_data: &Value) -> Result<bool, String> {
    //检查form中的value.rule是否存在，如果存在则使用value.rule对req进行校验
    serde_json::to_value(definition_value)
        .ok()
        .and_then(|rule_value| {
            let mut scope = valico::json_schema::Scope::new();
            scope
                .compile_and_return(rule_value, false)
                .ok()
                .map(|schema| {
                    schema.validate(form_data).errors.get(0).map(|first_err| {
                        Err(format!(
                            "invalid. title:{};path:{};code:{};{}",
                            first_err.get_title(),
                            first_err.get_path(),
                            first_err.get_code(),
                            first_err.get_detail().unwrap_or_default()
                        ))
                    })
                })
        })
        .flatten()
        .unwrap_or(Ok(true))
}
